package com.yzion.baselib.http

import com.blankj.utilcode.util.Utils
import com.yzion.baselib.http.cookie.CookieJarImpl
import com.yzion.baselib.http.cookie.PersistentCookieStore
import okhttp3.CookieJar
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit

/**
 * 配置网络请求参数，项目都需要自定义该配置类来满足业务功能，继承该类就对了
 * 例如服务器的响应成功代码由后端自定义，所以需要configResponseSuccessCode方法来定义后端响应的成功代码，
 * 用于成功响应的判断
 * ZJJ
 */
abstract class HttpConfig {

    companion object {
        /**
         * 默认连接超时
         */
        private const val DEFAULT_CONNECT_TIMEOUT_MILLS = (30 * 1000).toLong()

        /**
         * 默认读取超时
         */
        private const val DEFAULT_READ_TIMEOUT_MILLS = (30 * 1000).toLong()
    }


    /**
     * 配置应用拦截器
     */
    open fun configInterceptors(): List<Interceptor>? {
        return null
    }

    /**
     * 配置OkHttpClient
     */
    open fun configOkHttpClient(builder: OkHttpClient.Builder) {}

    /**
     * 配置Cookie存储，默认PersistentCookieStore
     */
    open fun configCookie(): CookieJar {
        return CookieJarImpl(PersistentCookieStore(Utils.getApp()))
    }

    /**
     * 配置连接超时时间（毫秒ms），默认30s
     */
    open fun configConnectTimeoutMills(): Long {
        return DEFAULT_CONNECT_TIMEOUT_MILLS
    }

    /**
     * 配置读取超时时间（毫秒ms），默认30s
     */
    open fun configReadTimeoutMills(): Long {
        return DEFAULT_READ_TIMEOUT_MILLS
    }

    /**
     * 是否打印请求日志，默认true
     */
    open fun configLogEnable(): Boolean {
        return true
    }

    /**
     * 配置自定义日志拦截器，默认HttpLoggingInterceptor，级别是Level.BODY
     */
    open fun configLogInterceptor(): Interceptor {
        return HttpLoggingInterceptor().apply {
            level = HttpLoggingInterceptor.Level.BODY
        }
    }

    /**
     * 是否开启请求和响应的进度监听，默认false
     */
//    open fun configProgressEnable(): Boolean {
//        return false
//    }

    /**
     * 配置Retrofit
     */
    open fun configRetrofit(builder: Retrofit.Builder?) {

    }

    /**
     * 应用服务器返回的成功代码，基本需要配置，用于判断请求响应是否成功，在BaseApi类的方法isSuccessful中判断
     * 因为业务返回真~成功才是算是成功，成功会回调BaseApi中的Callback<T>.onSuccess(data: T?)接口，
     * 一般服务器返回的代码由后端开发人员定义，例如：0000表示成功等，默认0
     */
    abstract fun configResponseSuccessCode(): String
}